package Dominio;
import hbt.PersistentObject;



import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.*;

import srv.*;

@Entity
@Table(name="ODV")
public class ODV extends PersistentObject {
	
	private static final long serialVersionUID = 1L;
	
	@Column(name="nombreOficina",nullable=false, length=50)
	private String nombreOficina;
	
	@OneToMany (cascade=CascadeType.ALL)
	@JoinColumn(name="oficinaDeVenta")
	private List<Cliente> clientes = new ArrayList<Cliente>();
	private srvCliente srv;
	private srvRodamientos srvr;
	private srvOrdenPedido srvOrdenPedido;
	private srvCotizacion srvCotizacion;
	private srvGenerico srvGenerico;
	private List<Pais> paises;
	private List<ItemSolicitudDeCotizacion>items;
	private List<OrdenDePedido> ordenesPedido;
	private List<Cotizacion> cotizaciones;
	private String direccion;
	private String nombre;
	//private List<OrdenCompra> ordenesCompra;
	//private  List<Remito> remitos;
	
	private ODV(){
		srv=new srvCliente();
		srvr=new srvRodamientos();
		srvOrdenPedido = new srv.srvOrdenPedido();
		srvCotizacion = new srv.srvCotizacion();
		srvGenerico = new srvGenerico();
		this.clientes = new ArrayList<Cliente>();
		this.items = new ArrayList<ItemSolicitudDeCotizacion>();
		this.paises = new ArrayList<Pais>();
		this.ordenesPedido = new ArrayList<OrdenDePedido>();
		this.cotizaciones = new ArrayList<Cotizacion>();
	}
	
	
	/* METODOS UTILIZADOS PARA EL ABM DE CLIENTES*/
	public void agregarCliente(int idCliente, String razonSoc, String tel,String calle,
			String numero,String piso,String departamento,String localidad, String area){
		Cliente cli =new Cliente();
		
		cli.setIdCliente(idCliente);
		cli.setRazonSocial(razonSoc);
		
		Telefono telefonoCliente = new Telefono();
		telefonoCliente.setArea(area);
		telefonoCliente.setNumero(tel);
		cli.getTelefonos().add(telefonoCliente);
		
		Domicilio dom= new Domicilio();
		dom.setCalle(calle);
		dom.setNumero(numero);
		dom.setPiso(piso);
		dom.setDepartamento(departamento);
		dom.setLocalidad(localidad);
		cli.setDomicilio(dom);
		
		srv.agregarCliente(cli);
		this.clientes.add(cli);
	}
	
	public void eliminarCliente(int id){
		
		if(this.clientes.size()!=0){			
			int i;
			for(i=0;i<this.clientes.size() && clientes.get(i).getIdCliente() == id ;i++);
			if(i<this.clientes.size())
				this.clientes.remove(i);		
			}
			Cliente cli=new Cliente();
			cli.setIdCliente(id);
			cli=srv.loadCliente(cli.getId());
			srv.eliminarCliente(cli);
	}
	
	public void listarClientes(){
		List<Cliente> lista=srv.listarClientes();
		for(Cliente cli :lista)
			System.out.println(cli);
	}
	
	public void modificarCliente (int idCliente,String razonSocial, String calle,String numero,String piso,String departamento,String localidad)
	{
		Cliente aux = srv.buscarCliente(idCliente);
		aux.setRazonSocial(razonSocial);
		aux.getDomicilio().setCalle(calle);
		aux.getDomicilio().setNumero(numero);
		aux.getDomicilio().setDepartamento(departamento);
		aux.getDomicilio().setLocalidad(localidad);
		srv.modificarCliente(aux);
	}
	
	public String ultimoIdCliente(){
		return srv.ultimoIdCliente();
	}
	
	public List<String> listaId(){
		return srv.listaId();
	}
	
	public Cliente buscarCliente (String id){
		return srv.buscarCliente(Integer.parseInt(id));
	}
	
	public String imprimirCliente(String id){
		return srv.imprimirCliente(Integer.parseInt(id));
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}
	
					/*******************************requerimienro uno hay que modificarlo************************************************/
		
	public boolean esClienteValido(String id){
		return srv.esCliente(Integer.parseInt(id));
	}
	
	public boolean coincideIdRz(String id,String rz){
		return srv.coincideIdRz(Integer.parseInt(id), rz);
	}
	
	public boolean existeNs(String ns){
		return srv.existeNs(ns);
	}

	public void generarListaDeItems ( String serie,String sufijo,String marca,String origen ,int cantidad){
		ItemSolicitudDeCotizacion item= new ItemSolicitudDeCotizacion();
		item.setCantidad(cantidad);
		this.items.add(item);
		System.out.println("agrego el item a la lista");
	}
	
	public void generarListaDeSolicitudes (String cuil, int numero){
		SolicitudDeCotizacion sc= new SolicitudDeCotizacion();
		sc.setCliente(srv.buscarCliente(Integer.parseInt(cuil)));
		Date fecha= Date.valueOf("01/01/1900");
		
		sc.setFechaSolicitud(fecha);
		
		
		srvCotizacion.agregarSolicitud(sc);
	}
	
	public void persistirSolicitudCotizaciones(List<SolicitudDeCotizacion> lista){
		srvCotizacion.agregarSolicitudCotizacion(lista);
	}
	
	
	/************************************************AMB DE RODAMIENTOS*****************************************************************/
	
	
		public void agregarRodamiento (String numeroSerie,String sufijo,String marca,String origen, int precio,int stock,String caracteristica){
			Rodamiento r= new Rodamiento();
			r.setCaracteristica(caracteristica);
			r.setPrecio(precio);
			
			Marca marc = new Marca();
			marc.setDescripcion(marca);
			marc.setNombre(marca);
			r.setMarca(marc);
			
			r.setNumeroSerie(numeroSerie);
			
			Pais paisOrigen = new Pais();
			paisOrigen.setNombre(origen);
			
			
			r.setPaisOrigen(paisOrigen);
			r.setStock(stock);
			r.setSufijo(sufijo);
			srvr.agregarRodamiento(r);
			
		}
		
		
		public boolean mismoRodamiento(String numeroSerie,String sufijo,String marca,String origen){
			return srvr.mismoRodamiento(numeroSerie,sufijo,marca, origen);
		}
	
	
		public int ultimoIdRodamiento(){
			return srvr.ultimoIdRodamiento();
		}
		
		
		public List<Integer> rodamientosId(){
			return srvr.rodamientosId();
		}
		
		public Rodamiento getRodamiento(int id){
			return srvr.getRodamiento(id);
		}
	
		public void eliminarRodamiento(int id){
			srvr.eliminarRodamiento(id);
		}
		
		
		public void modificarRodamiento(int id,String ns, String s, int m, int o,
				String c,float p, int cant, float medida, String codigoSKF, String codigo){
			srvr.modificarRodamiento(id,ns,s,m,o,c,p,cant, medida, codigoSKF,codigo);
			
		}
		
		
		
		
		
		
		
		
		

		/*Orden de Pedido*/
		public void generarOrdenPedido(String fecha, int numero, String idCliente){
			Cliente cliente = this.buscarCliente(idCliente);
			OrdenDePedido ordenPedido = srvOrdenPedido.crearOrdenPedido(cliente);
			this.ordenesPedido.add(ordenPedido);
		}
		
		public void generarItemPedido(int cantidad, int numeroOrdenPedido, int numeroRodamiento)
		{
			Rodamiento rod = srvr.getRodamiento(numeroRodamiento);
			OrdenDePedido orden = srvOrdenPedido.getOrdenPedido(numeroOrdenPedido);
			srvOrdenPedido.crearItemPedido(cantidad, orden, rod);
		}
		
		public void agregarItemOrdenPedido(int numeroOrdenPedido, int idItemPedido){
			OrdenDePedido orden = srvOrdenPedido.getOrdenPedido(numeroOrdenPedido);
			ItemOrdenDePedido item = srvOrdenPedido.getItemPedido(idItemPedido);
			srvOrdenPedido.agregarItemOrdenPedido(orden, item);
		}
		
		public void asignarCotizacionOrdenPedido(int numeroOrdenPedido, int numeroCotizacion){
			Cotizacion cotizacion = srvCotizacion.getCotizacion(numeroCotizacion);
			OrdenDePedido orden = srvOrdenPedido.getOrdenPedido(numeroOrdenPedido);
			srvOrdenPedido.asignarCotizacionOrdenPedido(orden, cotizacion);
		}
		
		/*Pais*/
		public void agregarPais(String sigla, String nombre){
			Pais pais = new Pais();
			pais.setNombre(nombre);
			pais.setNombre(nombre);
			this.paises.add(pais);
		}
		
		/*Forma de Pago*/
		public void agregarFormaPagoContado(float descuento){
			srvGenerico.newContado(descuento);
		}
		
		public void agregarFormaPagoFinanciado(int cantidadDias, float recargo){
			srvGenerico.newFinanciado(cantidadDias, recargo);
		}
		
		/*Cotizacion
		public void generarCotizacion(String fecha, String vigenciaDesde, String vigenciaHasta,
				String estado, String tipoFormaPago){
			FormaPago formaPago = srvGenerico.getFormaPagoByTipo(tipoFormaPago);
			Cotizacion cotizacion = srvCotizacion.crearCotizacion(Date.valueOf(fecha), Date.valueOf(vigenciaDesde), Date.valueOf(vigenciaHasta),
					estado, formaPago.toTO());
			this.cotizaciones.add(cotizacion);
		}*/
		
		public void asignarCotizacionSolicitudCotizacion(int numeroCotizacion, int numeroSolicitud){
			Cotizacion cotizacion = srvCotizacion.getCotizacion(numeroCotizacion);
			SolicitudDeCotizacion solicitud = srvCotizacion.getSolicitudCotizacion(numeroSolicitud);
			srvCotizacion.asignarSolicitudCotizacion(cotizacion, solicitud);
		}
		
		public void cambiarEstadoCotizacion(int numeroCotizacion, String nuevoEstado){
			Cotizacion cotizacion = srvCotizacion.getCotizacion(numeroCotizacion);
			srvCotizacion.cambiarEstado(cotizacion, nuevoEstado);
		}


		public srvGenerico getSrvGenerico() {
			return srvGenerico;
		}


		public void setSrvGenerico(srvGenerico srvGenerico) {
			this.srvGenerico = srvGenerico;
		}
}
